Tengo una matriz unidimensional de objetos como este:
var data = [ { "empId": 63758, "empCode": "000003A", "empName": "Robert", }, { "empId": 63759, "empCode": "000003B", "empName": "Paul John", }, { "empId": 63760, "empCode": "000003C", "empName": "Chris John", }, ];Quiero filtrar los datos de la misma manera que cuando usamos en la consulta sql "como '% john %'", y deseo que también pueda obtener texto que no distinga entre mayúsculas y minúsculas. por lo que dará salida:
var data = [= { "empId": 63759, "empCode": "000003B", "empName": "Paul John", }, { "empId": 63760, "empCode": "000003C", "empName": "Chris John", }, ];Ya intenté esto, pero el resultado es solo aceptar el parámetro de texto completo como "Chris John"
var filter = { "empName": "Chris John" } data = data.filter(function(item){ for(var key in filter){ if(item[key] == undefined || item[key] != filter[key]) return false } return true });por favor ayuda, gracias
Simplemente puede lograr esto usando String.indexOf() junto con el método Array.filter() .
Demostración en vivo :
var data = [ { "empId": 63758, "empCode": "000003A", "empName": "Robert", },{ "empId": 63759, "empCode": "000003B", "empName": "Paul John", },{ "empId": 63760, "empCode": "000003C", "empName": "Chris John", } ]; const filter = { "empName": "john" }; let res = data.filter(({ empName }) => empName.toLowerCase().indexOf(filter.empName) !== -1); console.log(res);Puede escribir otro método de utilidad para verificar los valores de la subcadena como se muestra a continuación:
var data = [ { empId: 63758, empCode: "000003A", empName: "Robert", }, { empId: 63759, empCode: "000003B", empName: "Paul John", }, { empId: 63760, empCode: "000003C", empName: "Chris John", }, ]; var filter = { empName: "joh", }; const checkLikeValue = (a, b) => { if(a === b) { return true } else if (typeof a === "string") { const substrings = a.split(" "); return substrings.some(str => b.toLowerCase().includes(str)) } return false } data = data.filter(function (item) { for (var key in filter) { if (item[key] == undefined || !checkLikeValue(filter[key], item[key])) return false; } return true; }); console.log(data);Esto se puede lograr usando include( includes() así como indexOf() (según la respuesta dada por @Rohit Jindal).
Otro enfoque sería usar includes .
var data = [ { "empId": 63758, "empCode": "000003A", "empName": "Robert", },{ "empId": 63759, "empCode": "000003B", "empName": "Paul John", },{ "empId": 63760, "empCode": "000003C", "empName": "Chris John", } ]; const filter = { "empName": "john" }; let res = data.filter(({ empName }) => empName.toLowerCase().includes(filter.empName)); console.log(res); La única diferencia sería una verificación adicional del valor de retorno de indexOf() que no es necesario cuando se usa include( includes() . En cuanto al rendimiento, ambos relojes son casi iguales.